home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Floppyshop 2
/
Floppyshop - 2.zip
/
Floppyshop - 2.iso
/
art&graf.ix
/
art-3303
/
pcsclick
/
pcsclick.s
< prev
Wrap
Text File
|
1985-11-19
|
16KB
|
778 lines
;FORCE_FILENAME
*-----------------------------------------------------------------------*
* USEFUL EQUATES *
*-----------------------------------------------------------------------*
MFP = $FFFFFA00
ENABLE_A = MFP+$07 ; int enable A
ENABLE_B = MFP+$09 ; int enable B
PENDING_A = MFP+$0B ; int pending A
PENDING_B = MFP+$0D ; int pending B
IN_SERVICE_A = MFP+$0F ; int in-service A
IN_SERVICE_B = MFP+$11 ; int in-service B
MASK_A = MFP+$13 ; int mask A
MASK_B = MFP+$15 ; int mask B
VECTOR = MFP+$17 ; MFP vector base
CTRL_A = MFP+$19 ; MFP timer A control
CTRL_B = MFP+$1B ; MFP timer B control
DATA_A = MFP+$1F ; timer A data
DATA_B = MFP+$21 ; timer B data
HBI_VEC = $68 ; Hblank timer
VBI_VEC = $70 ; VBI
KBD_VEC = $118 ; IKBD
TIMER_A = $134 ; General timer
TIMER_B = $120 ; Raster timer
LineADD = 160
PHYS_MED = $FFFF8201
PHYS_TOP = $FFFF8203
COLOUR = $FFFF8240
FREQ = $FFFF820A
*-----------------------------------------------------------------------*
* USEFUL MACROS *
*-----------------------------------------------------------------------*
push macro
move.\0 \1,-(sp)
endm
pop macro
move.\0 (sp)+,\1
endm
pushall macro
movem.l d0-d7/a0-a6,-(sp)
endm
popall macro
movem.l (sp)+,d0-d7/a0-a6
endm
delay macro ; wait for #n VBI's
move.w #\1,TIMER
.wz\@ tst.w TIMER
bne.s .wz\@
endm
sendkey macro
pea \2
push.w #\1-1
push.w #25
trap #14
addq #8,sp
endm
sync macro
IFEQ NARG-1
dcb.w \1,$4E71
ELSEIF
IFLT \1-3-3
dcb.w \1,$4E71
ELSEIF
move.w #(\1-3)/3-1,\2
.wc\@ dbra \2,.wc\@
Calc set (\1-3)-((\1-3)/3)*3
IFGT Calc
dcb.w Calc,$4E71
ENDC
ENDC
ENDC
endm
*-----------------------------------------------------------------------*
* Main display routine *
*-----------------------------------------------------------------------*
bsr COMMAND ; get TTP command line
clr.l -(sp) ; go into
move.w #$20,-(sp) ; supervisor mode.
trap #1 ;
addq.w #6,sp
move.l d0,-(sp) ; keep old stack
sendkey 1,MOUSE_OFF
sendkey 2,MOUSEBUTTON_KEY
move.l #(SCREEN1+255),d0
clr.b d0
move.l d0,PHYS_BITMAP
move.l #(SCREEN2+255),d0
clr.b d0
move.l d0,LOG_BITMAP
move.l #PALETTE1,PHYS_PALETTE
move.l #PALETTE2,LOG_PALETTE
bsr EMPTY_BUFFER ; clear keyboard buffer
bsr LOAD_PCS ; find and load file
sendkey 1,MOUSE_REL
bsr DISPLAY_PCS ; show off fancy piccy
EXIT: bsr EMPTY_BUFFER ; clear keyboard again
sendkey 2,MOUSEBUTTON_MOUSE
bsr EMPTY_BUFFER ; clear keyboard again
sendkey 1,MOUSE_REL
clr.w -(sp)
move #11,-(sp)
trap #13
addq.l #4,sp
move.w #$20,-(sp) ; back to
trap #1 ; user mode.
addq.w #6,sp
pea $4C0000 ; now quit
trap #1 ; to desktop
MOUSEBUTTON_KEY:
dc.b 7,%100
MOUSEBUTTON_MOUSE:
dc.b 7,%000
MOUSE_REL:
dc.b 8
MOUSE_ABS:
dc.b 9,0,100,0,100
MOUSE_OFF:
dc.b $12
MOUSE_RESET:
dc.b $80,1
even
COMMAND:
lea MODCOM,a0
move.l 8(sp),(a0)
add.l #$81,(a0)
rts
LOAD_PCS:
move.l #space,PIC_PTR
IFND FORCE_FILENAME
lea FILENAME,a0
move.l MODCOM,a1 ; insert name from command line
move.w #32-1,d0
.f move.b (a1)+,(a0)+
dbra d0,.f
ENDC
.cont clr.w -(sp)
pea FILENAME
push.w #61 ; open
trap #1
addq #8,sp
tst.w d0
bmi .err
move.w d0,HANDLE
push.l PIC_PTR
push.l #102000
push.w HANDLE
push.w #63
trap #1
add.w #12,sp
add.l PIC_PTR,d0
add.l #4,d0
and.b #-2,d0
move.l d0,BANK_PTR
push.w HANDLE
push.w #62
trap #1
addq #4,sp
move.l PIC_PTR,a0
cmp.l #"ICE!",(a0)
bne.s .exit
move.l BANK_PTR,a1
move.l a1,PIC_PTR
bsr DECRUNCH
.exit rts
.err addq #4,sp
bra EXIT
*-----------------------------------------------------------------------*
* DISPLAY 'PCS' ROUTINES START HERE *
*-----------------------------------------------------------------------*
DISPLAY_PCS: ; show one of my own snazzy 'PCS' pics.
bsr SAVE_SCREEN_SETUP ; init screen for piccy, saving old one
bsr INIT_VECTORS ; store old vector setup
move.l PIC_PTR,a0 ; get address of file
bsr UNPACK_PCS ; unpack picture onto screen(s).
delay 5 ; wait for 10 vbi's (in case of 50/60Hz
bsr ENHANCED_DISPLAY ; switch). Turn on display interrupt.
move.w TIME,d1
mulu #50,d1
subq.l #1,d1
.loop bsr GET_CODE
cmp.b #57,d0
bne.s .nsp
.wt2 bsr GET_CODE
bpl.s .wt2
cmp.w #57+128,d0
bne.s .wt2
bra.s .out
.nsp cmp.b #117,d0
bne.s .none
.wt bsr GET_CODE
bpl.s .wt
cmp.w #117+128,d0
bne.s .wt
bra.s .out
.none addq #1,TIMER ; wait for 1 VBI
.wtv tst.w TIMER
bne.s .wtv
subq.l #1,d1 ; decrement wait-counter.
bpl.s .loop
.out bsr STANDARD_DISPLAY ; when done, remove display interrupt.
bsr KILL_PALETTE
bsr RESET_VECTORS ; reset system stuff
bsr REPLACE_SCREEN_SETUP
rts
GET_CODE:
moveq #0,d0
move.b IKBD_DATA.w,d0
tst.b d0
rts
SAVE_SCREEN_SETUP:
lea COLOUR.w,a0 ; store old colours
lea OLD_PAL,a1
moveq #8-1,d0
.lp move.l (a0)+,(a1)+
dbra d0,.lp
move.w #4,-(sp) ; store old res
trap #14
addq #2,sp
move.w d0,OLD_RES
move.w #2,-(sp) ; store old screen address
trap #14
addq #2,sp
move.l d0,OLD_SCR
push.w #37
trap #14
addq #2,sp
push.w #0
pea -1.w
pea -1.w
push.w #5
trap #14
add.w #12,sp
bsr KILL_PALETTE ; black screen
move.l PHYS_BITMAP,a0 ; clear screen 1
bsr CLS
move.l LOG_BITMAP,a0 ; clear screen 2
bsr CLS
rts
REPLACE_SCREEN_SETUP:
bsr KILL_PALETTE ; black screen
move.l PHYS_BITMAP,a0 ; clear screen 1
bsr CLS
move.l LOG_BITMAP,a0 ; clear screen 2
bsr CLS
push.w #37
trap #14
addq #2,sp
push.w OLD_RES
push.l OLD_SCR
push.l OLD_SCR
push.w #5
trap #14
add.w #12,sp
lea OLD_PAL,a0
lea COLOUR.w,a1 ; store old colours
moveq #8-1,d0
.lp move.l (a0)+,(a1)+
dbra d0,.lp
rts
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
* UNPACK A 'PCS' PICTURE *
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
rsreset
PCS_width rs.w 1 ; usually 320 for now
PCS_height rs.w 1 ; usually 200 for now
PCS_interlace rs.b 1 ; PCS-ST/E = 0 : SuperHam and Pchrome <> 0
PCS_ste rs.b 1 ; uses ste palette? 50/60Hz?
PCS_start rs.b 0 ; end of file header
UNPACK_PCS:
clr.b HERZ
clr.b INTERLACE
lea PCS_start(a0),a1
move.l a0,a6
btst.b #0,PCS_ste(a6)
beq.s .hz60
.hz50 move.b #2,HERZ
.hz60 move.b HERZ,FREQ.w
move.l PHYS_BITMAP,a0
bsr.s UNPACK_BITMAP
move.l PHYS_PALETTE,a0
bsr UNPACK_PALETTE
tst.b PCS_interlace(a6)
beq.s .done
st INTERLACE
move.l LOG_BITMAP,a0
bsr.s UNPACK_BITMAP
move.l LOG_PALETTE,a0
bsr UNPACK_PALETTE
bsr XOR_BITMAP
bsr XOR_PALETTE
.done rts
UNPACK_BITMAP: ; decompress a bitmap.
moveq #0,d6
move.w #40,d2
move.w #200,d3
moveq #5,d4
move.b (a1)+,d7
lsl.w #8,d7
move.b (a1)+,d7
.Main moveq #0,d0
subq #1,d7
bmi.s .esc
move.b (a1)+,d0
bmi.s .B_block_copy
beq.s .W_run_length
cmp.b #1,d0
beq.s .W_block_copy
bra.s .B_run_length
.W_run_length
move.b (a1)+,d0
lsl.w #8,d0
move.b (a1)+,d0
.B_run_length
subq #1,d0
move.b (a1)+,d1
.run move.b d1,(a0,d6)
addq #1,d6
and.w #1,d6
bne.s .ok
addq #8,a0
.ok subq #1,d2 ; drop 1 line
bne.s .fine
moveq #40,d2
subq #1,d3
bne.s .fine
move.w #200,d3
lea 2-32000(a0),a0
subq #1,d4
beq.s .esc
.fine dbra d0,.run
bra.s .Main
.esc rts
.B_block_copy
neg.b d0
bra.s .nw
.W_block_copy
move.b (a1)+,d0
lsl.w #8,d0
move.b (a1)+,d0
.nw subq #1,d0
.blk move.b (a1)+,d1
move.b d1,(a0,d6)
addq #1,d6
and.w #1,d6
bne.s .ok2
addq #8,a0
.ok2 subq #1,d2 ; drop 1 line
bne.s .fin2
moveq #40,d2
subq #1,d3
bne.s .fin2
move.w #200,d3
lea 2-32000(a0),a0
subq #1,d4
beq.s .esc
.fin2 dbra d0,.blk
bra .Main
UNPACK_PALETTE: ; decompress a palette
move.b (a1)+,d7
lsl.w #8,d7
move.b (a1)+,d7
.Main moveq #0,d0
subq #1,d7
bmi.s .esc
move.b (a1)+,d0
bmi.s .B_block_copy
beq.s .W_run_length
cmp.b #1,d0
beq.s .W_block_copy
bra.s .B_run_length
.W_run_length
move.b (a1)+,d0
lsl.w #8,d0
move.b (a1)+,d0
.B_run_length
subq #1,d0
move.b (a1)+,d1
lsl.w #8,d1
move.b (a1)+,d1
.run move.w d1,(a0)+
dbra d0,.run
bra.s .Main
.esc rts
.B_block_copy
neg.b d0
bra.s .nw
.W_block_copy
move.b (a1)+,d0
lsl.w #8,d0
move.b (a1)+,d0
.nw subq #1,d0
.blk move.b (a1)+,d1
lsl.w #8,d1
move.b (a1)+,d1
move.w d1,(a0)+
dbra d0,.blk
bra.s .Main
XOR_BITMAP: ; delta decompression on bitmap.
btst.b #0,PCS_interlace(a6)
bne.s .nox
pushall
move.l PHYS_BITMAP,a0
move.l LOG_BITMAP,a1
move.w #32000/4-1,d0
.blop move.l (a0)+,d1
eor.l d1,(a1)+
dbra d0,.blop
popall
.nox rts
XOR_PALETTE: ; delta decompression on palette.
btst.b #1,PCS_interlace(a6)
bne.s .nox
pushall
move.l PHYS_PALETTE,a0
move.l LOG_PALETTE,a1
move.w #16*(3*199+1)-1,d0
.clop move.w (a0)+,d1
eor.w d1,(a1)+
dbra d0,.clop
popall
.nox rts
*-----------------------------------------------------------------------*
* COLOUR SWITCHING ROUTINE *
*-----------------------------------------------------------------------*
* This is the actual screen-display interrupt and setup code *
*-----------------------------------------------------------------------*
VIDEO_COUNTER = $FFFF8209
PHYSBASE = $FFFF8200
IKBD_CTRL = $FFFFFC00
IKBD_DATA = $FFFFFC02
PhotoChrome:
pushall
btst #1,FREQ.w
bne.s .hz50
move.b #32-10,SCANLINE
.hz60 move.l #SCAN_COUNTER_60HZ,HBI_VEC.w
bra.s .done
.hz50 move.b #62-10,SCANLINE
move.l #SCAN_COUNTER_50HZ,HBI_VEC.w
.done move.w #$2100,sr
move.l PHYS_BITMAP,d0
lsr.w #8,d0
move.l d0,PHYSBASE.w
tst.b INTERLACE
beq.s .scrn
move.l PHYS_BITMAP,d0
move.l LOG_BITMAP,PHYS_BITMAP
move.l d0,LOG_BITMAP
move.l LOG_PALETTE,d0
move.l PHYS_PALETTE,LOG_PALETTE
move.l d0,PHYS_PALETTE
.scrn move.l PHYS_PALETTE,a0
addq #2,a0
lea 2+COLOUR.w,a1
move.w (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
lea SCANLINE,a0
.wait tst.b (a0)
bne.s .wait
move.w #$2300,sr
.read btst #0,IKBD_CTRL.w
beq.s .out
move.b IKBD_DATA.w,d0
bra.s .read
.out lea TIMER,a0
tst.w (a0)
ble.s .zero
subq #1,(a0)
.zero popall
rte
SCANLINE: ds.w 1
SCAN_COUNTER_50HZ:
subq.b #1,SCANLINE
ble.s SCREEN_RASTER_50HZ
rte
SCREEN_RASTER_50HZ:
move.w #$2700,sr
lea (.ssp)+2,a6
move.l a7,(a6)
lea VIDEO_COUNTER.w,a6
moveq #0,d0
moveq #64,d7
.wait move.b (a6),d0
beq.s .wait
sub.w d0,d7
lsl.w d7,d0
move.l PHYS_PALETTE(pc),a7
lea 32(a7),a7
sync 53,d0
rept 199
movem.l (a7)+,d0-a6
movem.l d0-d7,COLOUR.w
movem.l a0-a6,COLOUR.w
move.l (a7)+,28+COLOUR.w
lea COLOUR.w,a0
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.w #0,COLOUR.w
move.l (a7)+,(a0)+
nop
nop
nop
nop
nop
nop
nop
endr
.ssp move.l #0,a7
pea ARTE
pop.l HBI_VEC.w
move.b #$23,(sp)
ARTE: rte
SCAN_COUNTER_60HZ:
subq.b #1,SCANLINE
ble.s SCREEN_RASTER_60HZ
rte
SCREEN_RASTER_60HZ:
move.w #$2700,sr
lea (.ssp)+2,a6
move.l a7,(a6)
lea VIDEO_COUNTER.w,a6
moveq #0,d0
moveq #64,d7
.wait move.b (a6),d0
beq.s .wait
sub.w d0,d7
lsl.w d7,d0
move.l PHYS_PALETTE(pc),a7
lea 32(a7),a7
sync 52,d0
rept 199
movem.l (a7)+,d0-a6
movem.l d0-d7,COLOUR.w
movem.l a0-a6,COLOUR.w
move.l (a7)+,28+COLOUR.w
lea COLOUR.w,a0
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.l (a7)+,(a0)+
move.w #0,COLOUR.w
move.l (a7)+,(a0)+
nop
nop
nop
nop
nop
nop
endr
.ssp move.l #0,a7
pea ARTE
pop.l HBI_VEC.w
move.b #$23,(sp)
rte
*-----------------------------------------------------------------------*
* INITIALISE PCS DISPLAY INTERRUPT *
*-----------------------------------------------------------------------*
ENHANCED_DISPLAY:
move.w #$2700,sr
move.l LOG_BITMAP,d0
lsr.w #8,d0
move.l d0,PHYSBASE.w
pea PhotoChrome
pop.l VBI_VEC.w
move.w #$2300,sr
rts
STANDARD_DISPLAY:
move.w #$2700,sr
pea NEW_VBI
pop.l VBI_VEC.w
move.w #$2300,sr
rts
*-------------------------------------------------------------------------*
INIT_VECTORS:
lea VECTORS,a0
move.l USP,a1
move.l a1,(a0)+
move.l HBI_VEC.w,(a0)+
move.l VBI_VEC.w,(a0)+
move.l KBD_VEC.w,(a0)+
move.l TIMER_A.w,(a0)+
move.l TIMER_B.w,(a0)+
move.b ENABLE_A.w,(a0)+
move.b ENABLE_B.w,(a0)+
move.b MASK_A.w,(a0)+
move.b MASK_B.w,(a0)+
move.b DATA_A.w,(a0)+
move.b DATA_B.w,(a0)+
move.b CTRL_A.w,(a0)+
move.b CTRL_B.w,(a0)+
move.b VECTOR.w,(a0)+
move.b FREQ.w,(a0)+
move.w #$2700,sr
pea NEW_VBI
pop.l VBI_VEC.w
move.b #0,ENABLE_A.w
move.b #1<<6,ENABLE_B.w ; leave IKBD alone
move.w #$2300,sr
rts
RESET_VECTORS:
move.w #$2700,sr
lea VECTORS,a0
move.l (a0)+,a1
move.l a1,USP
move.l (a0)+,HBI_VEC.w
move.l (a0)+,VBI_VEC.w
move.l (a0)+,KBD_VEC.w
move.l (a0)+,TIMER_A.w
move.l (a0)+,TIMER_B.w
move.b (a0)+,ENABLE_A.w
move.b (a0)+,ENABLE_B.w
move.b (a0)+,MASK_A.w
move.b (a0)+,MASK_B.w
move.b (a0)+,DATA_A.w
move.b (a0)+,DATA_B.w
move.b (a0)+,CTRL_A.w
move.b (a0)+,CTRL_B.w
move.b (a0)+,VECTOR.w
move.b (a0)+,FREQ.w
move.w #$2300,sr
rts
NEW_VBI:
push.l a0
lea TIMER,a0
tst.w (a0)
ble.s .rte
subq #1,(a0)
.rte pop.l a0
rte
*-------------------------------------------------------------------------*
EMPTY_BUFFER:
pushall
bsr.s FLUSH ; flush the IKBD properly (sorry, GEM!)
.bak push.w #11
trap #1
addq #2,sp
tst.l d0
beq.s .out
push.w #7
trap #1
addq #2,sp
bra.s .bak
.out popall
rts
FLUSH:push.w d7
.read btst #0,$FFFFFC00.w ; empty hardware ikbd buffer
beq.s .out
move.b $FFFFFC02.w,d7
bra.s .read
.out pop.w d7
rts
KILL_PALETTE:
moveq #8-1,d7
lea COLOUR.w,a0
.lp clr.l (a0)+
dbra d7,.lp ; empty out palette
rts
CLS: move.w #32000/4-1,d0
.loop clr.l (a0)+
dbra d0,.loop
rts
IFD FORCE_FILENAME
FILENAME: dc.b "F:\pcs\*.PCS",0
even
ELSEIF
FILENAME: ds.b 64
ENDC
DECRUNCH: include c:\packers\ice\ice_unpa.s
*-----------------------------------------------------------------------*
SECTION DATA
*-----------------------------------------------------------------------*
TIME: dc.w 500 ; number of seconds to display picture
PIC_PTR: ds.l 1
BANK_PTR: ds.l 1
PHYS_PALETTE: ds.l 1 ; palette 1 address
LOG_PALETTE: ds.l 1 ; palette 2 address
PHYS_BITMAP: ds.l 1 ; screen 1 address
LOG_BITMAP: ds.l 1 ; screen 2 address
HANDLE: ds.w 1
*-----------------------------------------------------------------------*
SECTION BSS
*-----------------------------------------------------------------------*
MODCOM: ds.l 1
OLD_SCR ds.l 1
TIMER: ds.w 1
OLD_PAL ds.w 16
OLD_RES: ds.w 1
VECTORS: ds.b 40
INTERLACE: ds.b 1
HERZ: ds.b 1
even
SCREEN1: ds.b 32768
SCREEN2: ds.b 32768
PALETTE1: ds.w (16*3*200)+16
PALETTE2: ds.w (16*3*200)+16
space: ds.b 102000